/**══════════════════════════════════╗
*作    者：songbaobao                                                 ║
*职    业：我以我血荐轩辕                                              ║
*CSND地址：https://blog.csdn.net/weixin_43949535                       ║
**GitHub ：https://github.com/TsinghuaLucky912/My_own_C-_study_and_blog║
**GitEE  ：https://gitee.com/lucky912_admin/code-up_-pat               ║
*═══════════════════════════════════╣
*创建时间：                                                           
*功能描述：                                                            
*                                                                      
*                                                                      
*═══════════════════════════════════╣
*结束时间:                                                           
*═══════════════════════════════════╝
//                .-~~~~~~~~~-._       _.-~~~~~~~~~-.
//            __.'              ~.   .~              `.__
//          .'//              西南\./联大               \\`.
//        .'//                     |                     \\`.
//      .'// .-~"""""""~~~~-._     |     _,-~~~~"""""""~-. \\`.
//    .'//.-"                 `-.  |  .-'                 "-.\\`.
//  .'//______.============-..   \ | /   ..-============.______\\`.
//.'______________________________\|/______________________________`.
*/
#include "main.h"

/*
* 使用双缓冲绘图
*/
void gameInit(Planes& plane, vector<Bullets>&bullet, vector<Enemys>&enemy)
{
	BeginBatchDraw();

	// 绘制主窗口，加载背景图片
	mainWindow();

	// 在屏幕右侧打印分数窗口
	scoreWindow(plane);

	// 在屏幕右侧打印游戏玩法
	usageWindow();

	// 绘制飞机
	planeWindow(plane);

	// 绘制子弹
	bulletWindow(bullet);

	// 绘制敌机
	enemyWindow(enemy);

	EndBatchDraw();
}
/*
* 飞机的上下左右移动以及边界控制,子弹的发射
*/
void gameControl(Planes& plane, int speed, vector<Bullets>& bullet)
{
	/* 使用Windows的系统API 非阻塞函数 GetAsyncKeyState */
	if ((GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W')) && (plane.getY() - speed > 0))
	{
		plane.modifyY(-1 * speed);
	}

	if ((GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S')) && (plane.getY() + plane.height <= WIDOWHEIGHT - speed))
	{
		plane.modifyY(speed);
	}

	/*
	* 左右的移动 是可以移动到 飞机的中间机身
	*/
	if ((GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A')) && (plane.getX() + 0.5 * plane.width - speed > 0))
	{
		plane.modifyX(-1 * speed);
	}

	if ((GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D')) && (plane.getX() + plane.width * 0.5 + speed <= WIDOWWIDTH))
	{
		plane.modifyX(speed);
	}

	/* ------------------------------------------------------------------------- */
	/* 使用空格进行发射子弹(每隔300ms) */
	static DWORD t1 = 0, t2 = 0;
	if (GetAsyncKeyState(VK_SPACE) && t2 - t1 > 300)
	{
		for (vector<Bullets>::iterator it = bullet.begin(); it != bullet.end(); ++it)
		{
			if (!(it->getStatus()))
			{
				it->setX(plane.getX() + plane.width * 0.5);
				it->setY(plane.getY());
				it->setStatus(true);

				break;
			}
		}
		t1 = t2;
	}
	t2 = GetTickCount64();
	/* ------------------------------------------------------------------------- */

#if 0
	// 已舍弃

	/*
	* 若要是考虑到平台无关的良好移植性 使用如下方法
	*/
	if(kbhit())
	{
		char keyChar = getch();

		switch (keyChar)
		{
		case 'w':
		case 'W':
			plane.modifyY(-1 * speed);
			break;
		case 's':
		case 'S':
			plane.modifyY(speed);
			break;
		case 'a':
		case 'A':
			plane.modifyX(-1 * speed);
			break;
		case 'd':
		case 'D':
			plane.modifyX(speed);
			break;
		default:
			cout << "Please use the wsad key on the keyboard!" << endl;
		}
	}
#endif
}

/*
* 子弹的移动
*/
void bulletMove(vector<Bullets>& bullet, int speed)
{
	for (vector<Bullets>::iterator it = bullet.begin(); it != bullet.end(); ++it)
	{
		if (it->getStatus())
		{
			it->modifyY(-1 * speed);

			if (it->getY() < 0)
			{
				it->setStatus(false);
			}
		}
	}
}

/*
* 敌机的产生
*/
void enemyCreate(vector<Enemys>& enemy)
{
	// srand((unsigned)time(nullptr));
	for (vector<Enemys>::iterator it = enemy.begin(); it != enemy.end(); ++it)
	{
		if (!(it->getStatus()))
		{
			it->setStatus(true);

			it->setX(rand() % (WIDOWWIDTH - it->getWidth()));
			it->setY(0);

			it->setType((EnemyType)(rand() % 3));

			if (it->getType() == EnemyType::smallType)
			{
				it->renewAttributes(28, 21, 1);
			}
			else if (it->getType() == EnemyType::middleType)
			{
				it->renewAttributes(46, 66, 2);
			}
			else
			{
				it->renewAttributes(72, 114, 4);
			}

			break;
		}
	}
}

/*
* 敌机的移动
*/
void enemyMove(vector<Enemys>& enemy, int speed)
{
	for (vector<Enemys>::iterator it = enemy.begin(); it != enemy.end(); ++it)
	{
		if (it->getStatus())
		{
			it->modifyY(speed);

			if (it->getY() >= WIDOWHEIGHT)
			{
				it->setStatus(false);
			}
		}
	}
}

/*
* 控制敌机产生速度的回调函数
*/
void CallTimerFunc(CALLFUN fp,DWORD interval, vector<Enemys>& enemy)
{
	static DWORD t1 = 0, t2 = 0;
	if (t2 - t1 > interval)
	{
		fp(enemy);
		t1 = t2;
	}
	t2 = GetTickCount64();
}

/*
* 控制敌机下落速度的回调函数
*/
void CallTimerFuncControlSpeed(CALLFUN2 fp, DWORD interval, vector<Enemys>& enemy, int speed)
{
	static DWORD t1 = 0, t2 = 0;
	if (t2 - t1 > interval)
	{
		fp(enemy, speed);
		t1 = t2;
	}
	t2 = GetTickCount64();
}

/*
* 成功击中敌机
*/
void SuccessfullyHit(Planes& plane, vector<Enemys>& enemy, vector<Bullets>& bullet)
{
	for (vector<Enemys>::iterator it = enemy.begin(); it != enemy.end(); ++it)
	{
		if (!(it->getStatus()))
		{
			continue;
		}

		for (vector<Bullets>::iterator it1 = bullet.begin(); it1 != bullet.end(); ++it1)
		{
			if (!(it1->getStatus()))
			{
				continue;
			}

			// 子弹已经进入敌机的内部
			if (it1->getX() >= it->getX() && it1->getX() <= it->getX() + it->getWidth()
				&& it1->getY() >= it->getY() && it1->getY() <= it->getY() + it->getHeight())
			{
				it1->setStatus(false);

				it->modifyBloodVolume();
				if (it->getBloodVolume() == 0)
				{
					it->setStatus(false);
					if (it->getType() == EnemyType::smallType)
					{
						plane.modifyScore(1);
					}
					else if (it->getType() == EnemyType::middleType)
					{
						plane.modifyScore(2);
					}
					else
					{
						plane.modifyScore(4);
					}
				}
			}
		}

	}
}
/**
*备用注释：
*
*
*
*/
